/**
 * 集合的工具类，提供查找，转换及计算功能
 */
export class CollectionHelper {
  /**
   * 通过指定属性的值来搜索数组中对象
   * @param collections 数据
   * @param value 标志位
   * @param valueField 要比较的属性，不指定则为id
   */
  public static findItem<T>(collections: Array<T>, value: any, valueField: string = 'id'): T {
    const found = collections.find(item => {
      return item[valueField] === value;
    });
    return found ? found : null;
  }

  /**
   * 搜索树节点（单个）中属性为指定值的节点
   * @param collections 源数据
   * @param value 搜素值
   * @param valueField 要比较的节点的属性
   */
  public static findTreeItem(collections: Array<any>, value: any, valueField: string = 'id'): any {
    let found = null;
    // tslint:disable-next-line: prefer-for-of
    for (let i = 0; i < collections.length; i++) {
      if (collections[i][valueField] === value) {
        found = collections[i];
        return found;
      }
      if (collections[i].children && collections[i].children.length > 0) {
        found = CollectionHelper.findTreeItem(collections[i].children, value, valueField);
        if (found) return found;
      }
    }
    return found;
  }

  /**
   * 合并数组，如果array1和array2的对象具有相同的属性值，则只要array2中的数据，如果不存在，则添加到array1中
   * @param array1 目标数组
   * @param array2 准备合并的数组
   * @param valueField 匹配的属性（不传则按两个数组完全合并）
   */
  public static mergeArray<T>(array1: Array<T>, array2: Array<T>, valueField?: string): Array<T> {
    if (valueField) {
      array2.forEach(item => {
        let found: any;
        found = array1.find(o => {
          return o[valueField] === item[valueField];
        });
        if (!found) {
          array1.push(item);
        }
      });
      return array1;
    } else {
      return array1.concat(array2).filter(v => !array1.includes(v));
    }
  }

  /**
   * 数组字段累加
   * @param collections 源数据
   * @param labelField 累加字段
   */
  public static sumField(collections: Array<any>, labelField: string): number {
    let temp = 0;
    if (collections && collections.length > 0) {
      collections.forEach(i => {
        temp += Number(i[labelField]);
      });
      return temp;
    }
    return temp;
  }

  /**
   * 将指定字段拼接字符串，如果不指定字段，则数组中的数据应为简单数据类型，直接拼接
   * @param collections 源数据
   * @param labelField 拼接字段
   * @param separator 分隔符
   */
  public static linkName(collections: Array<any>, labelField?: string, separator: string = ','): string {
    let temp = '';
    if (collections && collections.length > 0) {
      collections.forEach(item => {
        temp += `${labelField ? item[labelField] : item}${separator}`;
      });
    }

    // 截掉最后的分隔符
    return temp.substring(0, temp.length - 1);
  }
}
